#!/usr/bin/python3
# -*- coding:utf-8 -*-
""""
@Author: 李吉凯
@Email: lijk34925@hundsun.com
@Time: 2022/12/2 13:50
@File: 查询页面公共
方法.py
"""

import random
import time

from qturboframe.lib.utils.by import By
from qturboframe.lib.utils.variable import Variable

from BladeFerm.Lib.Common import data_processing, logger, DownPath
from BladeFerm.hui12_common.check_data import check_data_not_contains, check_file_exit, check_data_contains
from BladeFerm.hui2_app import FE
from BladeFerm.hui2_app.hui2_lib.home_tab import HomeTab
from BladeFerm.utils.basic_opration import clear_dir
from CommonScripts.common_method_hui_two import open_menu, arm_form_fill
from CommonScripts.check_result_hui_two import check_table, check_ele_no_text, check_ele_text

""""
函数功能：查询页面，查询功能
数据示例：
input_data:
    - 菜单名称: 产品风险评估/产品风险评估查询
      产品名称: 产品001
      产品代码: 123
      最近评级日期: 2022/10/01 - 2022/10/31
      评定状态: 已归档
      产品状态: 正常
      产品系列: 普通基金
      当前评级结果: 中风险
      上次评级结果: 中风险

ui_expect:
    - 产品名称: 产品001
"""


@data_processing
def function_search(input_data=None, ui_expect=None):
    open_menu({'子系统名称': '反洗钱系统', '菜单名称': input_data.pop("菜单名称")})

    # 搜索框表单填入
    arm_form_fill(input_data)

    # 检查查询结果
    check_table(input_data=None, ui_expect=ui_expect)  # 此方法待完成


""""
函数功能：查询页面，新增数据。
数据示例：
input_data:
    - 菜单名称: 产品风险评估/产品风险评估查询
      产品名称: 产品007
      产品代码: a007
      产品状态: 正常
      产品系列: 普通基金

ui_expect:
    - 产品名称: 产品004
"""


@data_processing
def function_add(input_data=None, ui_expect=None):
    open_menu({'子系统名称': '反洗钱系统', '菜单名称': input_data.pop("菜单名称")})

    # 点击 新增
    FE.button("新增产品").click()
    FE.button(idname={'xpath': f'.//li[@class="h-dropdown-item"]/span[contains(text(),"单个新增")]'}).click()

    # 填写表单
    ext = str(random.randint(0, 100))
    product_name = input_data.get('产品名称', '')
    product_code = input_data.get('产品代码', '')
    if product_name and product_name.endswith("**"):
        product_name = product_name.replace("**", ext)
        dic = {'产品名称': product_name}
        input_data.update(dic)
        ui_expect.update(dic)
    if product_code and product_code.endswith("**"):
        product_code = product_code.replace("**", ext)
        dic2 = {'产品代码': product_code.replace("**", ext)}
        input_data.update(dic2)
        ui_expect.update(dic2)
    idname = {'xpath': '//div[@class="h-modal-header"]/div[contains(text(),"新增产品信息")]//'
                       'ancestor::div[@class="h-modal-content"]/div[@class="h-modal-body"]/form'}
    form = FE.form(idname=idname)
    form.auto_fill_group(input_data)

    # 点击提交
    express = f'//div[@class="h-modal-footer"]//button/span[contains(text(),"提交")]//parent::button'
    FE.button(idname={By.XPATH: express}).click()

    # 检查查询结果
    time.sleep(1)
    table = FE.table_new()
    table.check_expect_row(ui_expect, 1)

    # 设置返回变量
    variable = Variable()
    variable.set_variable('varc_product_name', product_name)
    variable.set_variable('varc_product_code', product_code)


""""
函数功能：查询页面，选择表格的数据并修改。
数据示例：
input_data:
    - 菜单名称: 产品风险评估/产品风险评估查询
      修改目标:
          产品名称: 产品003
      修改内容:
          产品状态: 发行成功
          产品系列: 保本基金

ui_expect:
    - 期望结果: 修改产品信息
"""


@data_processing
def function_modify(input_data=None, ui_expect=None):
    open_menu({'子系统名称': '反洗钱系统', '菜单名称': input_data.pop("菜单名称")})

    # 表格点击
    table = FE.table_new()
    table.click_cell(input_data.get("修改目标"), {"操作": "修改"})

    # 填写表单
    idname = {'xpath': '//div[@class="h-modal-header"]/div[contains(text(),"修改产品信息")]//'
                       'ancestor::div[@class="h-modal-content"]/div[@class="h-modal-body"]/form'}
    form = FE.form(idname=idname)
    form.auto_fill_group(input_data.get("修改内容"))

    # 点击提交
    express = f'//div[@class="h-modal-footer"]//button/span[contains(text(),"提交")]//parent::button'
    FE.button(idname={By.XPATH: express}).click()

    # 检查查询结果
    check_ele_no_text(input_data=None, ui_expect=ui_expect)


""""
函数功能：查询页面，选择表格的数据并删除。
数据示例：
input_data:
    - 菜单名称: 产品风险评估/产品风险评估查询
      产品名称: "产品007"

ui_expect:
    - 允许删除: 是
      检查名称: "产品007"
"""


@data_processing
def function_delete(input_data=None, ui_expect=None):
    open_menu({'子系统名称': '反洗钱系统', '菜单名称': input_data.pop("菜单名称")})

    # 表格点击
    table = FE.table_new()
    table.select_row(input_data)

    # 点击 新增
    FE.button("删除").click()

    # 点击确认弹框
    if ui_expect.pop("允许删除") == "是":
        click_ele = {"xpath": f'//div[@class="h-modal-confirm-footer"]/button/span[contains(text(),"确定")]'}
        FE.msg_box("确定要删除选中的数据").click_button(idname=click_ele)

    # 检查查询结果
    check_ele_no_text(input_data=None, ui_expect={"期望结果": ui_expect.get("检查名称")})


@data_processing
def function_details(input_data=None, ui_expect=None):
    menu_name = input_data.pop("菜单名称")
    open_menu({'子系统名称': '反洗钱系统', '菜单名称': menu_name})

    # 表格点击
    table = FE.table_new()
    table.click_cell(input_data.get("定位信息"), input_data.get("点击单元"))

    time.sleep(1)

    # 检查查询结果
    home_tab = HomeTab(menu_name, idname={By.CSS_SELECTOR: 'div.h-layout-tabbar'}, father=FE.driver, timeout=5)
    cur_tabs = home_tab.get_tabs_text()
    check_data_contains(ui_data=ui_expect.get("新标签页"), original_data=cur_tabs)
    check_ele_text(input_data=None, ui_expect=ui_expect)

""""
函数功能：查询页面，刷新表格数据。
数据示例：
input_data:
  - 菜单名称: 可疑交易管理/可疑交易查询

ui_expect: []
"""


def function_refresh(input_data=None, ui_expect=None):
    '''
    表格的刷新按钮，数据刷新
    Args:
        input_data:
        ui_expect:

    Returns:

    '''
    open_menu({'子系统名称': '反洗钱系统', '菜单名称': input_data.get('菜单名称')})
    if input_data.get("表头名称", None):
        grid = FE.table_new({'text': input_data.get("表头名称")})
    else:
        grid = FE.table_new()
    grid.refresh()


""""
函数功能：查询页面，导出表格数据。
数据示例：
input_data:
  - 菜单名称: 可疑交易管理/可疑交易查询
    导出全部否: 否
    表头名称: 客户名称
    导出数据行:
      流程状态: 流程发起

ui_expect:
  - 文件名称: 可疑交易查询
"""


# 示例：导出数据到文件
@data_processing
def function_export(input_data=None, ui_expect=None):
    # 清空目录
    res = clear_dir(DownPath)
    logger.info(f"res: {res}")

    open_menu({'子系统名称': '反洗钱系统', '菜单名称': input_data.get('菜单名称')})
    # 导出 数据
    if input_data.get("表头名称", None):
        grid = FE.table_new({'text': input_data.get("表头名称")})
    else:
        grid = FE.table_new()
    is_all = True if input_data.get('导出全部否', '是') == '是' else False
    grid.export(is_all=is_all, rows=input_data.get('导出数据行', None))

    # 校验 检查文件是否存在
    check_file_exit(ui_expect.get("文件名称", "风险等级查询"))
    # todo：校验文件内容---各组自己评估



""""
函数功能：查询页面，表格表头显示列设置。
数据示例：
input_data:
  -   菜单名称: 可疑交易管理/可疑交易查询
      表头名称: 客户名称
      取消列名: ["归档日期"]

ui_expect:
  - 取消的列名: ["归档日期"]
"""


@data_processing
def function_set_col_name(input_data=None, ui_expect=None):
    logger.debug(f'DownPath： {DownPath}')
    # 进入 风险等级查询 菜单
    open_menu({'子系统名称': '反洗钱系统', '菜单名称': input_data.get('菜单名称')})
    if input_data.get("表头名称", None):
        grid = FE.table_new({'text': input_data.get("表头名称")})
    else:
        grid = FE.table_new()
    grid.refresh()
    cancel_cols = input_data.get('取消列名')
    grid.set_col_name(cancel_cols)
    col_name = grid.get_title_list()
    check_data_not_contains(ui_expect.get('取消的列名'), col_name)